/----------------------------------------------------------------------------\
|-[ 07 ]----[ Protocolo HTTP ]----[ Medio ]----------------------------------|
\------------------------------------------------------------------[ Tahum ]-/


                                    HTTP
                                    ====

                            Por Tahum , julio 2000
                            ----------------------

                            < Tahum@phreaker.net >


                   Indice:

                o  Prefacio ..............................1
                o  Introduccion ..........................2
                o  Versiones .............................3
                o  Funcionamiento del HTTP ...............4
                o  Especificacion del protocolo ..........5
                o  URI ...................................6
                o  Cabeceras .............................7
                o  Solicitudes ...........................8
                o  Respuestas ............................9
                o  Metodos ..............................10
                o  Codigos ..............................11
                o  Longitud del mensaje .................12
                o  Negociacion ..........................13
                o  Despedida ............................14




 - Prefacio - 1 -
 ================

 En este articulo explicare el funcionamiento del protocolo HTTP, protocolo
 que considero esencial su conocimiento, pues es el responsable del 'boom'
 de Internet en estos ultimos a~os.

 Obviamente este documento esta basado en otros documentos, los cuales
 podreis encontrar en el apendice, y sobre los cuales recomiendo
 encarecidamente su lectura.

 Muchos estareis pensando que para que escribir sobre algo de lo que otros
 ya lo han hecho, mejor que como yo lo hare aqui. Los documentos con los que
 aprendi http son algo aridos, y si se es un novato pero aun asi se tienen
 ganas de profundizar en esto, hace falta un texto que cumple funciones
 didacticas mas que de manual de referencia. Espero haber conseguido esto al
 escribir este documento.

 No se explica aqui el funcionamiento de shttp, sin embargo los que esteis
 interesados en el y no conozcais http, conviene que os diga que funcionan
 de manera semejante, teniendo shttp mas funciones para hacer nuestras
 transmisiones mas seguras.



 - Introduccion - 2 -
 ====================

 Como ya todos sabreis (un capon para el que no) la popularidad de internet
 se basa sobre todo en la WWW, o World Wide Web (Ahora repetir esto con un
 mazapan en la boca), y la WWW se cimienta en un protocolo llamado HyperText
 Transfer Protocol. Http para los amigos.

 Este protocolo es un protocolo de nivel de aplicacion, usado para
 intercambiar informacion Hipermedia dentro del a WWW.

 Gracias a la Hipermedia no solo se permitia el enlace a otros documentos
 html sino ahora tambien a sonidos, fotos... videos... el invento del siglo,
 vaya.

 Este protocolo fue inventado por Tim Berners-Lee, un se~or al que se le
 ocurrio un buen dia que estaba en el laboratiro europeo de fisica de
 particulas del CERN el crear este protocol para regocijo nuestro.



 - Versiones - 3 -
 =================

 Veamos ahora las distintas versiones Http que ha habido y cuales han sido
 sus cambios:

 HTTP 0.9: Esta version tiene una finalidad bien sencilla, la de transmitir
           datos de forma secuencial a traves de la red.

 HTTP 1.0: En esta version se soportan ya los mensajes en formato MIME, y se
           hace mas versatil. Sin embargo conserva la mala costumbre de
           generar una conexion TCP distinta cada vez que tiene que descargar
           una URL, por lo que se produce en los servidores una saturacion
           del copon cada 2 x 3.

 HTTP 1.1: Esta version es la mas reciente, y es bastante mas eficaz. Ahora
           puedes conocer las capacidades de los ordenadores que estan
           implicados en una comunicacion HTTP, ademas que permite el tener
           un servidor con varias Ip's, permita las conexiones persistentes
           ahorrando recursos, etc. Aqui una misma conexion puede albergar
           en si VARIAS peticiones y respuestas, con las siguientes ventajas:

           o Se ahorra tiempo de CPU.
           o Se ahorra memoria.
           o Se ahorra tiempo ya que los paquetitos pesan menos.
           o Las solicitudes y respuestas HTTP se pueden multiplexar, de
             manera que un cliente puede hacer muchas solicitudes al servidor
             y este responderle 1 sola vez de manera que no tenga que estar
             esperando una respuesta por cada solicitud. Esto hace que se
             ahorre tiempo, cosa que ya he dicho antes.
           o Se puede informar al cliente o al servidor de errores en la red
             sin tener que cerrar la conexion.
           o Se deja mas tranquilito al servidor al disminuir en gran
             cantidad los paquetes TCP que por el viajan.



 - Funcionamiento del HTTP - 4 -
 ===============================

 Este protocolo funciona (salvo algunos casos) sobre los protocolos TCP/IP,
 y las conexiones se realizan por el puerto 80, si es que el admin no lo ha
 cambiado. Si lo ves cambiado puede ser por razones de seguridad (no quieren
 tener ese puerto abierto a la vista de todos), por que varios servidores
 cada uno con su propio puerto para obtener el mismo servicio, etc.



 - Especificacion del protocolo - 5 -
 ====================================

 Para indicarse las versiones del protocolo HTTP entre los ordenadores que
 establecen una conexion, este utiliza un sistema de numeracion del tipo
 <mayor> y <menor>, el en cual el emisor indica el formato del mensaje y su
 capacidad para poder establecer prosperas comunicaciones HTTP sin problemas.

 Por si no ha quededo claro lo del <mayor> y <menor>, decir que estas
 etiquetas vienen a ser numeros. El numero menor se incrementa cuando los
 cambios que se hacen al protocolo a~aden nuevas caracteristicas que no
 cambian para nada el formato general del algoritmo que se utiliza para
 analizar sintacticamente el mensaje, pero que si dota de mejoras adicionales
 al emisor. Y el numero mayor se incrementa cuando el formato del mensaje
 dentro del protocolo ha cambiado.

 La version del mensaje HTTP se indica en el campo "HTTP-Version", en la
 primera linea del mensaje. Si no se indica pues se da por hecho que es la
 version 1.0. Si se especificara la version tendria un aspecto como este:

                         HTTP-Version: HTTP/1.1

 Aqui se pone la version 1.1 pero podria ser otra.
 Ahora veamos que pasaria en una comunicacion con dos versiones diferentes.
 Si la version del emisor es superior, tendria que degradarse la version
 hasta quedar como la del receptor, para que este pueda interpretarlo.
 Si en lugar de esto el emisor tiene una version inferior, pues no pasaria
 na de na porque el receptor al tener una version superior es capaz de
 interpretar el mensaje.



 - URI - 6 -
 ===========

 URI son las siglas de Uniform Resource Identifiers, o lo que es lo mismo
 identificador uniforme de recursos. Seguramente muchos de vosotros estais
 acostumbrados a oir hablar de URL's, pero no de URI's, pues sabed que son
 digamos sinonimos (esto realmente no es asi, que nadie me mate!) y que lo
 que viene a significar URL es Localizador Uniforme de recursos. Podeis decir
 URI o URL, segun os venga en gana.
 Una Url es una cadena de texto con un formato determinado que identifica
 un recurso dentro de una red. Este contiene la siguiente informacion:

           o Nombre del recurso.
           o Protocolo que hay que utilizar para encontrarlo.
           o Lugar donde se encuentra.

 Y tendria una forma como la siguiente:

        servicio://host:puerto/camino?lugar_que_keremos_buscar

 Donde pone servicio pues poneis Http, Ftp, Telnet, File... y los puertos
 por defecto supongo que los sabreis... sino mal vamos. Sin embargo por si
 hubiera algun despistado leyendo esto lo dire:

                           Http   : 80
                           Ftp    : 21
                           Telnet : 23

 Estos son los puertos *POR DEFECTO*, lo que significa que en algunas
 maquinas estos pueden cambiar, aunque no es muy normal ver una maquina que
 asigne a un servicio su puerto predeterminado.

 Si no poneis el puerto seguido del host pues se escoge el puerto por
 defecto, y depende la aplicacion que usemos si no especificamos el servicio
 pues coge el puerto de ese servicio. Me explico, si utilizamos el telnet
 cogera el 23, el cliente de ftp el 21, y el navegador el 80, si no le
 especificais lo contrario.

 Sobre la longitud que deben tener estas es recomendable limitarlo a 255, de
 lo contrario se nos podria contestar con un error de codigo 414. Sin embargo
 no hay un limite establecido.



 - Cabeceras - 7 -
 =================

 Las cabeceras de mensaje pueden ser de 4 tipos diferentes:

 1.- Cabeceras generales.
 2.- Cabeceras de solicitudes.
 3.- Cabeceras de respuestas.
 4.- Cabeceras de entidades.

 El orden en el que se reciben no tiene ninguna importancia, pero por
 costumbre se ponen primero los campos de las cabeceras generales, despues
 los de las cabeceras de solicitud, despues los de las cabeceras de
 respuestas y por ultimo los campos de las cabeceras de entidad.

 A continuacion os pongo una tabla sobre los identificadores de las
 cabeceras y su valor y descripcion:


                             CABECERAS GENERALES
                             -------------------

 Identificador = Valor       Descripcion
 --------------------------- ------------------------------------------------

 Date = Fecha                Utiliza el formato estandar de fecha.
 MIME-version = version      Especifica la version MIME de las cabeceras.
 Pragma = directiva          Especifica una directiva concreta de la
                             implementacion Pragma.



                             CABECERAS DE PETICION
                             ---------------------

 Identificador = Valor       Descripcion
 --------------------------- ------------------------------------------------

 Accept = tipos              Permite describir que tipos de datos se aceptan
                             como respuesta.
 Accept-Charset = tipo       Permite describir que tipos de caracteres se
                             aceptan en la respuesta.
 Accept-Encoding = tipo      Permite restringir los valores de codificacion.
 Accept-Lenguage = leng.     Permite definir en que lenguaje se desea obtener
                             la respuesta.
 Authorization = cred.       Incluye la informacion de identificacion del
                             cliente para acceder a recursos compartidos. Lo
                             que se llama credenciales.
 From = id. De correo        Identifica cual es el origen del mensaje.
 Host = host:puerto          Identifica el host y al puerto donde se
                             encuentra el recurso.
 If-modified-Since = fecha   Se utiliza para que el comando GET sea
                             condicional.
 if-match = condicion        Este permite el establecer una condicion.
 if-none-match = condicion   Permite establecer una condicion negada.
 if-Range = condicion        Permite recuperar parte de una entidad si se
                             cumple la condicion.
 if-Unmodified-Since = fecha Este se utiliza para que el servidor ejecute la
                             accion si el recurso no ha sido modificado desde
                             la fecha indicada.
 Max-Forwards = numero       Se utiliza con el metodo TRACE para limitar el
                             numero maximo de proxys o gateways que pueden
                             reenviar el mensaje.
 Referer = URL               La identidad del elemento de donde se obtuvo el
                             enlace.
 User Agent = producto       Identifica al software del cliente.



                             CABECERAS DE RESPUESTA
                             ----------------------

 Identificador = Valor       Descripcion
 --------------------------- ------------------------------------------------

 Age = tiempo                El tiempo estimado desde que la respuesta fue
                             generada.
 Location = URL              Localizacion preferida del servidor para este
                             elemento.
 Proxy-Authenticate          Este campo tiene que ser incluido cuando se
                             envia un codigo de error 407 (ver seccion
                             codigos)
 Public = lista_de_metodos   Lista todos los metodos soportados por el
                             servidor.
 Retry-After = tiempo        Indica el tiempo estimado que el servicio no va
                             a estar operativo.
 Server = producto           Identifica el software del servidor.
 Vary = tipo                 Indica que la entidad de respuesta fue
                             seleccionada entre las diferentes respuestas
                             disponibles.
 Warning = information       Los datos que identifican al sistema de
                             autentificacion y acuerda con el cliente que se
                             autentifique el mismo.



                             CABECERAS DE ENTIDAD
                             --------------------


 Identificador = Valor       Descripcion
 --------------------------- ------------------------------------------------

 Allow = metodo              Lista de metodos que admite un recurso.
 Content-encoding = tipo     Si se utiliza codificacion indica el algoritmo
                             utilizado.
 Content-Language = leng     Describe el lenguaje natural de la informacion.
 Content-location = URI      Identifica el lugar del recurso que viaja en el
                             mensaje.
 Content-lenght = tama~o     Tama~o del cuerpo a transferir.
 Content-MD5 = md5           Proporciona deteccion de la alteracion del
                             mensaje.
 Content-range = bytes       Se inserta en los mensajes cuendo estos se
                             trocean para indicar que posicion ocupan en el
                             mensaje original.
 Content-type = tipo         Tipos que establece la IANA.
 Etag = etiqueta             Define la etiqueta de la entidad.
 Expires = fecha             Fecha en la que el elemento expirara, no valdra.
 Last-modified = fecha       Ultima vez que se modifico elelemento.



 - Solicitudes - 8 -
 ===================

 Las solicitudes son los mensajes que circulan desde el cliente hasta el
 servidor. Estas solicitudes pueden ser simples o completas. Una solicitud
 simple consta de un metodo y un URI (Identificador Uniforme de Recursos)

 Una solicitud completa consta de una linea de solicitud seguida de una serie
 de cabeceras, a continuacion una linea en blanco y posteriormente el cuerpo
 del mensaje.

 La URI solicitada identifica al elemento sobre el cual se hace la solicitud.
 Dependiendo de la solicitud URI puede venir dada mediante un camino relativo
 o un camino absoluto.

 Por si lo de camino relativo o absoluto no lo teneis muy claro dire que un
 camino absoluto es cuando la solicitud no se hace directamente al servidor,
 sino que se hace sobre un servidor proxy; el proxy sera el que mande la
 solicitud al servidor y recogera luego la respuesta para darsela a la
 maquina cliente.



 - Respuestas - 9 -
 ==================

 Las respuestas con los mensajes que viajan desde el servidor hasta el
 ordenador cliente. Estas, como las peticiones, pueden ser simples o
 completas. A las solicitudes simples les tocan respuestas simples y a las
 solicitudes compuestas les tocan respuestas... (todos a coro) compueestaas!!

 La primera linea de una respuesta completa es siempre su linea de estado, en
 las que se encuentra la version del protocolo, seguida de un codigo de
 estado y su frase asociada.


 - Metodos - 10 -
 ================

 Los metodos de mensaje son los siguientes:

 - Delete: Solicita al servidor que elimina la entidad indicada por la URI.
           Lo malo de esto es que el cliente no sabe si se ha llevado con
           exito la operacion o no, incluso si le llega un codigo que
           comience por 2.

 - Get: Descarga un elemento. Este permite recuperar del servidor cualquier
        informacion identificada por el URI solicitada en un solo paso. Si el
        URI hace referencia a un proceso generador de datos (un CGI), lo que
        se recuperan son los datos y no el codigo fuente del proceso.
        
 - Head : Solicita ver las cabeceras que se enviarian con un elemento
          concreto. Es decir, es como el metodo GET, pero a este el servidor
          no le envia el cuerpo (ni el alma!) sino que solo le envia la
          informacion situada en las cabeceras HTTP.

 - Options: Permite al cliente consultar que metodos hay asociados a un
            recurso. Es una simple solicitud de informacion sobre las
            opciones de comunicacion disponibles para el recurso apuntado por
            un URI. De esta manera el cliente puede determinar las
            posibilidades que tiene el servidor o las opciones asociadas a un
            recurso determinado.

 - Post: Envia un elemento al servidor. Se utiliza para decirle al servidor
         que acepte la informacion que se envia adjunto el mensake. Esto se
         utiliza normalmente en las listas de distribucion, grupos de
         noticias, en los formularios, etc.

 - Put: Solicita colocar la informacion enviada en la URI identificada. Si la
        informacion que se le envia ya existe se considera una actualizacion
        de recurso. Si el URI hace referencia a un recurso existente, y esta
        tiene la posibilidad de ser definida como un nuevo recurso, el
        servidor sera el que se encargue de crear este recurso.

 - Trace: Permite obtener una replica del mensaje enviado, de esta forma el
          cliente sabe con certeza que recibio el servidor. Si se ha recibido
          bien pues enviara un mensaje con un codigo que empiece por 2.



 - Codigos - 11 -
 ================

 Veamos ahora que tipos de codigos hay en el protocolo HTTP y para que
 sirven. De estos codigos vereis todos son de 3 digitos, de los cuales
 SOLO el primero tiene un significado especial, identificativo.

 Los tipos de codigos se catalogan dependiendo de su primer digito, este es
 el digito identificativo que mas arriba decia. Y aqui esta su descripcion:


 Codigo Descripcion
 ------ ---------------------------------------------------------------------

 1tt    Este no se utiliza, se reserva para futuras necesidades.
 2tt    Este viene a decir que la accion fue recibida y aceptada.
 3tt    Redireccion, se necesita una accion adicional para llevar a cabo la
        solicitud.
 4tt    Error del cliente, la solicitud contiene una sintaxis erronea o no
        se puede conceder porque la ruta es inexistente... etc.
 5tt    Error del servidor con una peticion aparentemente correcta.

              (donde la t seria un digito en base decimal)


 Ahora veamos los valores individuales de los tipos de codigo. En la
 descripcion pondre la frase en ingles y en espa~ol.

 Codigo Descripcion
 ------ ---------------------------------------------------------------------

 200    Ok = Todo correcto.
 201    Created = Creado.
 202    Accepted = Aceptado.
 204    No content = No hay contenido.
 205    Reset content = Reiniciar contenido.
 206    Partial content = Reiniciar contenido.
 300    Multiple choices = Opciones multiples.
 301    Moved permanently = Cambiado permanentemente.
 302    Moved Temporality = Cambiado temporalmente.
 304    Not modified = No modificado.
 305    User proxy = Utilizar proxy.
 400    Bad request = Solicitud erronea.
 401    Unauthorized = No autorizado.
 402    Payment require = Se requiere pago.
 403    Forbidden = Prohibido.
 404    Not found = No encontrado.
 405    Method nor allowed = Metodo no permitido.
 406    Not acceptable = No aceptable.
 407    Proxy aythentification required = Se requiere autentificacion de proxy.
 409    Conflict = Conflicto.
 411    Lenght require = Se requiere longitud.
 413    Request entity too large = Entidad solicitada es demasiado grande.
 414    Request URI too large = URI solicitada es demasiado grande.
 500    Internal server error = Error interno del servidor.
 501    Not implemented = No implementado.
 502    Bad Gateway = Gateway erroneo.
 503    Service Unavaliable = Servicio no disponible.



 - Longitud del mensaje - 12 -
 =============================

 La longitud de los mensajes en HTTP viene marcada por los siguientes puntos
 (en caso de que el cuerpo del mensaje se incluya en el mismo mensaje):


 - Si el campo transfer-encoding aparece en la cabecera del mensaje e indica
   que al mensaje se le ha aplicado el metodo "chunked", la longitud viene
   determinada por la codificacion utilizada.

 - Si aparece el campo de la cabecera Content-lenght (longitud del
   contenido), su valor en bytes representa la longitud del mensaje.

 - Si el mensaje es de tipo multipart (el cual se delimita a si mismo),
   entonces esa delimitacion define el tama~o.

 - Cualquier mensaje de respuesta que no incluye un cuerpo de mensaje se da
   por finalizado cuando aparece la primera linea en blanco.

 - Debido a que el servidor cierra la conexion y el mensaje se queda a
   medias.



 - Negociacion - 13 -
 ====================

 Cualquier servidor que trabaje con la version 1.1 de HTTP asume que un
 cliente tiene la intencion de realizar una conexion persistente, a no ser
 que en la cabecera del mensaje de solicitud se encuentre el parametro close,
 claro.

 El cliente puede esperar a que una conexion permanezca abierta, pero la
 decision final la tomara el servidor al fin y al cabo, ya que si el envia el
 parametro close al cliente la conexion a tomar por culo.

 En HTTP 1.1 las conexiones permanentes se asumen por defecto, a no ser que
 se le especifique lo contrario enviandole el parametro close en la cabecera
 del mensaje como creo que ya dije antes.



 - Despedida - 14 -
 ==================

 Espero que este texto os haya servido para aprender mas sobre el http. Si
 teneis alguna sugerencia/comentario/critica *constructiva*, podeis mandarla
 a Tahum(at)phreaker(dot)net

 This is all for now.


 Tahum, 2000.

*EOF*
